package class01;

/** 给定一个参数N 返回: 1! + 2! + 3! + 4! + N! 的结果 */
public class Code02_SumOfFactorial {

  public static long f1(int N) {
    // 相对耗时
    // 每个阶乘独立计算
    // 1 + 1*2 + 1*2*3
    long ans = 0;
    for (int i = 1; i <= N; i++) {
      ans += factorial(i);
    }
    return ans;
  }

  public static long factorial(int N) {
    long ans = 1;
    for (int i = 1; i <= N; i++) {
      ans *= i;
    }
    return ans;
  }

  public static long f2(int N) {
    // 节约一次循环
    // 利用上一次结果乘以当前阶
    // 1! + 1!*2 + 2!*3
    long ans = 0;
    long cur = 1;
    for (int i = 1; i <= N; i++) {
      cur = cur * i;
      ans += cur;
    }
    return ans;
  }

  public static void main(String[] args) {
    int N = 10;
    System.out.println(f1(N));
    System.out.println(f2(N));
  }
}
